// 引入必要的命名空间
using Microsoft.AspNetCore.Authorization; // 提供授权相关的功能
using Microsoft.AspNetCore.Mvc; // 提供MVC控制器和ActionResult支持
using UniversalAdmin.Application.DTOs; // 引入数据传输对象定义
using UniversalAdmin.Application.Services; // 引入服务层接口和实现

// 定义控制器的命名空间
namespace UniversalAdmin.Api.Controllers;

// 标记该类为API控制器
[ApiController]
// 定义路由模板，v1表示API版本，[controller]会自动替换为控制器名称
[Route("api/v1/[controller]")]
// 继承自ControllerBase，提供基础的控制器功能
public class MenuController : ControllerBase
{
    // 注入菜单服务接口
    private readonly IMenuService _menuService;

    // 构造函数，依赖注入IMenuService
    public MenuController(IMenuService menuService)
    {
        _menuService = menuService;
    }

    // HTTP GET方法，获取所有菜单
    [HttpGet]
    public async Task<IActionResult> GetAllMenus()
    {
        // 调用服务层获取所有菜单
        var menus = await _menuService.GetAllMenusAsync();
        // 返回200 OK响应，包含菜单列表
        return Ok(menus);
    }

    // HTTP GET方法，获取菜单树结构
    [HttpGet("tree")]
    public async Task<IActionResult> GetMenuTree()
    {
        // 调用服务层获取菜单树
        var menuTree = await _menuService.GetMenuTreeAsync();
        // 返回200 OK响应，包含菜单树
        return Ok(menuTree);
    }

    // HTTP GET方法，根据ID获取单个菜单
    [HttpGet("{id}")]
    public async Task<IActionResult> GetMenuById(Guid id)
    {
        // 调用服务层根据ID获取菜单
        var menu = await _menuService.GetMenuByIdAsync(id);
        // 如果菜单不存在，返回404 Not Found响应
        if (menu == null)
            return NotFound(new { message = "菜单不存在" });
        // 返回200 OK响应，包含菜单信息
        return Ok(menu);
    }

    // HTTP POST方法，创建新菜单
    [HttpPost]
    public async Task<IActionResult> CreateMenu([FromBody] CreateMenuDto dto)
    {
        try
        {
            // 调用服务层创建菜单
            var menu = await _menuService.CreateMenuAsync(dto);
            // 返回201 Created响应，包含新菜单的URI和菜单信息
            return CreatedAtAction(nameof(GetMenuById), new { id = menu.Id }, menu);
        }
        catch (Exception ex)
        {
            // 如果发生异常，返回400 Bad Request响应，包含错误信息
            return BadRequest(new { message = ex.Message });
        }
    }

    // HTTP PUT方法，更新菜单
    [HttpPut("{id}")]
    public async Task<IActionResult> UpdateMenu(Guid id, [FromBody] UpdateMenuDto dto)
    {
        try
        {
            // 调用服务层更新菜单
            var menu = await _menuService.UpdateMenuAsync(id, dto);
            // 如果菜单不存在，返回404 Not Found响应
            if (menu == null)
                return NotFound(new { message = "菜单不存在" });
            // 返回200 OK响应，包含更新后的菜单信息
            return Ok(menu);
        }
        catch (Exception ex)
        {
            // 如果发生异常，返回400 Bad Request响应，包含错误信息
            return BadRequest(new { message = ex.Message });
        }
    }

    // HTTP DELETE方法，删除菜单
    [HttpDelete("{id}")]
    public async Task<IActionResult> DeleteMenu(Guid id)
    {
        try
        {
            // 调用服务层删除菜单
            var success = await _menuService.DeleteMenuAsync(id);
            // 如果菜单不存在，返回404 Not Found响应
            if (!success)
                return NotFound(new { message = "菜单不存在" });
            // 返回204 No Content响应，表示删除成功
            return NoContent();
        }
        catch (InvalidOperationException ex)
        {
            // 如果发生异常，返回400 Bad Request响应，包含错误信息
            return BadRequest(new { message = ex.Message });
        }
    }

    // HTTP GET方法，根据角色ID获取菜单列表
    [HttpGet("role/{roleId}")]
    public async Task<IActionResult> GetMenusByRole(Guid roleId)
    {
        // 调用服务层根据角色ID获取菜单列表
        var menus = await _menuService.GetMenusByRoleAsync(roleId);
        // 返回200 OK响应，包含菜单列表
        return Ok(menus);
    }

    // HTTP POST方法，为角色分配菜单
    [HttpPost("role/{roleId}/assign")]
    public async Task<IActionResult> AssignMenusToRole(Guid roleId, [FromBody] RoleMenuAssignmentDto dto)
    {
        try
        {
            // 验证角色ID是否匹配
            if (roleId != dto.RoleId)
            {
                return BadRequest(new { message = "路径中的角色ID与请求体中的角色ID不匹配" });
            }

            // 调用服务层为角色分配菜单
            await _menuService.AssignMenusToRoleAsync(dto.RoleId, dto.MenuIds);
            // 返回200 OK响应，表示操作成功
            return Ok(new { message = "菜单分配成功" });
        }
        catch (Exception ex)
        {
            // 如果发生异常，返回400 Bad Request响应，包含错误信息
            return BadRequest(new { message = ex.Message });
        }
    }
}